package cz.vse.adventura.po1715.cerj117_cermak.hra;

import  cz.pecinovsky.english.pojj.adv_framework.game_txt.IPlace;
import java.util.Collection;



/*******************************************************************************
 * Instance třídy {@code PříkazJdi} představuje příkaz
 * k přesunu z aktuální mistosti do zadané místnosti. Aby byl příkaz proveden,
 * musí byt zadaná místnost z aktuální místnosti dosažitelná.
 *
 * @author    Jiří Čermák
 * @version   1.0
 */
public class PříkazJdi extends Příkaz
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    private static final String NEPROVEDENO = 
        "Akce nebyla provedena. Nebyla zadána místnost, do níž se má přejít.";

    private static final String NELZE = 
            "Do zadané místnosti se odsud nedá přejít.";

    private static final String PRESUN = 
            "Přesunul(a) jste se do místnosti: ";

     private static final String NEZAPLACENO =
            "Nezaplatil si. Nemůžeš odejít. ";

     private static final String ZAMCENO =
            "Tato místnost je zamčena. Musíte si nejdříve půjčit klíč. ";



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří instanci mající na strosti reakci na příkaz <b>jdi</b>,
     * po jehož zadaní se hráč přesune do místnosti,
     * jejíž název bude uveden za příkazem.
     */
    public PříkazJdi()
    {
        super( "Jdi",
               "Přesune hráče do zadané místnosti.\n" +
               "Tato místnost musí být dostupná z aktuální místnosti." );
    }


//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Přesune hráče do zadané cílové místnosti;
     * před tím však zkontroluje, zda byla zadána cílová místnost a
     * zda je do ní možno se v daném okamžiku z aktuální místnosti přesunout.
     *
     * @param parametry Místnost, kam se hráč chce přesunout
     * @return Text zpravy vypsane po provedeni prikazu
     */
    @Override
    public String execute( String... parametry )
    {
        if (parametry.length == 0) {
            return NEPROVEDENO;     //==========>
        }
        Místnosti aktuální = Místnosti.getAktuálníMístnost();
        Collection<? extends IPlace> sousedé = aktuální.getNeighbors();
        Místnosti cil = Místnosti.getMístnost(parametry[0]);
        if ((cil == null)  ||  (! sousedé.contains(cil))){
            return NELZE;           //==========>
        }

        // podmínka, když nezaplaceno, nemůžeš odejít z hospody
        if (aktuální == Místnosti.hospoda && parametry[0].equalsIgnoreCase("náměstí") && Stav.OBJEDNANO && Stav.NEZAPLACENO) {
            return NEZAPLACENO;
        }

        // podmínka, zajišťující zamčení místnosti - musíš mít klíč aby si mohl jít na toalety
        if (aktuální == Místnosti.hospoda && parametry[0].equalsIgnoreCase("toalety") && !Stav.KLIČ_PŮJČEN) {
            return ZAMCENO;
        }

        if (parametry[0].equalsIgnoreCase("Nádraží") && Batoh.getBatoh().obsahuje("Magie")) {

            Místnosti.setAktuálníMístnost(Místnosti.nádraží);
            return new PříkazKonec().execute();

        }


        Místnosti.setAktuálníMístnost(cil);
        return PRESUN + cil;        //==========>
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        PříkazJdi x = new PříkazJdi();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
